home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 007 / jovept1.arc / CMODE.C < prev    next >
Text File  |  1985-05-30  |  3KB  |  149 lines

  1. /*   cmode.c */
  2.  
  3. /*
  4.    Jonathan Payne at Lincoln-Sudbury Regional High School 5-25-83
  5.  
  6.    jove_c.c
  7.  
  8.    contains commands for C mode, paren matching routines are in here. */
  9.  
  10.  
  11.  
  12. #include "jove.h"
  13.  
  14.  
  15. BUFLOC *
  16. m_paren(orig, stop)
  17. char    orig;        /* One we are on */
  18. LINE    *stop;
  19. {
  20.     char    *origs = "(){}",
  21.         *matches = ")(}{",
  22.         matcher;
  23.     int    which,
  24.         forward,
  25.         count = 0;
  26.     register LINE    *lp = curline;
  27.     register char    *cp,
  28.             c;
  29.     int    c_char = curchar;
  30.     static BUFLOC    ret;
  31.  
  32.     which = index(origs, orig) - origs;
  33.     forward = (which % 2) == 0;
  34.     matcher = matches[which];
  35.  
  36.     while (count >= 0) {
  37.         if ((forward && lp == stop->l_next) ||
  38.                     (!forward && lp == stop->l_prev))
  39.             return 0;
  40.         if (forward) {
  41.             cp = getright(lp, genbuf) + c_char;
  42.             while (c = *++cp) {
  43.                 c_char++;
  44.                 if (c == matcher)
  45.                     count -= NotInQuotes(genbuf, c_char);
  46.                 else if (c == orig)
  47.                     count += NotInQuotes(genbuf, c_char);
  48.                 if (count < 0)
  49.                     goto done;
  50.             }
  51.             lp = lp->l_next;
  52.             c_char = -1;
  53.         } else {
  54.             cp = getright(lp, genbuf);
  55.             cp += (c_char >= 0 ? c_char : (c_char = strlen(genbuf)));
  56.             while ((cp > genbuf) && (c = *--cp)) {
  57.                 --c_char;
  58.                 if (c == matcher)
  59.                     count -= NotInQuotes(genbuf, c_char);
  60.                 else if (c == orig)
  61.                     count += NotInQuotes(genbuf, c_char);
  62.                 if (count < 0)
  63.                     goto done;
  64.             }
  65.             c_char = -1;
  66.             lp = lp->l_prev;
  67.         }
  68.     }
  69. done:
  70.     if (count >= 0)
  71.         return 0;
  72.     ret.p_line = lp;
  73.     ret.p_char = forward ? (cp - genbuf) + 1 : (cp - genbuf);
  74.     return &ret;
  75. }
  76.  
  77. Fparen()
  78. {
  79.     FindMatch(1);
  80. }
  81.  
  82. Bparen()
  83. {
  84.     FindMatch(-1);
  85. }
  86.  
  87. /* Move to the matching brace or paren depending on the current position
  88.  * in the buffer.
  89.  */
  90.  
  91. FindMatch(dir)
  92. {
  93.     BUFLOC    *bp;
  94.     char    c;
  95.  
  96.     bp = dosearch(dir > 0 ? "[{(]" : "[})]", dir, 1);
  97.     if (bp == 0)
  98.         complain((char *) 0);
  99.     SetDot(bp);
  100.     if (dir > 0)
  101.         BackChar();
  102.     c = linebuf[curchar];
  103.     if (c == '\0' || index("){}(", c) == 0)
  104.         complain((char *) 0);
  105.     if (!NotInQuotes(linebuf, curchar))    /* If in quotes */
  106.         complain("In quotes");
  107.     else {
  108.         bp = m_paren(c, dir > 0 ? curbuf->b_dol : curbuf->b_zero);
  109.         if (bp)
  110.             SetDot(bp);
  111.         else
  112.             complain("No match");
  113.     }
  114. }
  115.  
  116. /* Make sure character at c_char is not surrounded by double
  117.  * or single quotes.
  118.  */
  119.  
  120. char    quots[10];
  121.  
  122. NotInQuotes(buf, pos)
  123. char    *buf;
  124. {
  125.     char    quotchar = 0,
  126.         c;
  127.     int    i;
  128.  
  129.     if (quots[0] == 0)
  130.         return 1;    /* Not in quotes */
  131.     for (i = 0; i < pos && buf[i]; i++) {
  132.         if ((c = buf[i]) == '\\') {
  133.             i++;
  134.             continue;
  135.         }
  136.         if (!index(quots, c))
  137.             continue;
  138.         if (quotchar == 0)
  139.             quotchar = c;
  140.         else if (c == quotchar)
  141.             quotchar = 0;    /* Terminated string */
  142.     }
  143.     return (quotchar == 0);
  144. }
  145.  
  146.  
  147. /*----------------------------------o.s. dependent------------------*/
  148. /* end */
  149.